home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #include <stdio.h>
- #include <dos.h>
- #include "define.h"
-
- /* コンパクト情報の読み取り */
- /*
- * decice_no: device number (Towns CD-ROM -> 0)
- * cd_type: 1 -> CD-DA, 2 -> data, 3 -> CD-DA+data
- * start_track: 先頭トラック(曲)番号
- * end_track: 最終トラック(曲)番号
- * struct TIMEADRS {
- * char min;
- * char sec;
- * char frame;
- * } *track_times, 各トラック毎の演奏時間(最大99曲分必要)
- * *disk_all_time; ディスク内の演奏時間
- * 曲の最後まで演奏する場合は,終了時間にディスク内演奏時間-1を設定する.
- * return: 0 -> 正常終了, 0以外 -> エラー
- */
- int cdr_cdinfo(int device_no, int *cd_type, int *start_track, int *end_track,
- struct TIMEADRS track_times[], struct TIMEADRS *disk_all_time)
- {
- union REGS reg;
- struct SREGS seg;
- char buf[303]; /* buffer of Table Of Contents */
- char *p; /* pointer to buf */
- int i;
-
- reg.h.ah = 0x54;
- reg.h.al = (0xC0 | (u_char) device_no);
- reg.x.cx = 0x0000;
-
- reg.x.di = (u_int) buf;
- segread(&seg);
- seg.ds = seg.ss;
-
- int86x(0x93, ®, ®, &seg);
-
- if (reg.h.ah == 0) {
- if (cd_type) {
- *cd_type = buf[0];
- }
- if (start_track) {
- *start_track = buf[1];
- }
- if (end_track) {
- *end_track = buf[2];
- }
- if (disk_all_time) {
- disk_all_time->min = buf[3];
- disk_all_time->sec = buf[4];
- disk_all_time->frame = buf[5];
- }
- p = buf + 6;
- if (track_times) {
- for (i = 0; i <= *end_track - *start_track; i++) {
- track_times[i].min = p[0];
- track_times[i].sec = p[1];
- track_times[i].frame = p[2];
- p += 3;
- }
- }
- return 0;
- } else if (reg.h.ah == 0x02) { /* device number error */
- return DEVERR;
- } else if (reg.h.ah == 0x10) { /* cd-da plaing */
- return DEVPLY;
- } else { /* (reg.h.ah == 0x80) hard ware error */
- return reg.x.cx;
- }
- }
-
-